home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 3 / CD ACTUAL 3.iso / linux / incoming / jstools-.6v3 / jstools- / jstools-tk3.6v3.0 / lib / jtextedt.tcl < prev    next >
Encoding:
Text File  |  1995-02-05  |  9.3 KB  |  364 lines

  1. # jtextedt.tcl - support for EDT text bindings
  2. # Copyright 1994-1995 by Achim Bohnet <ach@rosat.mpe-garching.mpg.de>.
  3. # All rights reserved, except that this file may be freely redistributed
  4. # in whole or in part for non-profit, noncommercial use.
  5. #
  6. # Modified by Jay Sekora.  Achim's version was more general, sharing a lot
  7. # of procedures between Entry and Text bindings.  That's a direction I want
  8. # to go in, but I didn't have time to integrate it into my sources. ---j.
  9.  
  10. #     EDT (emulation of the standard VAX/VMS AXP/VMS editor)
  11.  
  12. ###############################################################################
  13. # to do:       - all commands repeatable (j:text does it but why j:text:bof??
  14. #        - use private selection for edt-/paste/cut/append/clear
  15. #        - edt:page does not work (see comment in jmouse* ??)
  16. ###############################################################################
  17.  
  18. proc j:tb:edt_init { {t Text} } {
  19.   global j_teb
  20.   j:debug "'edt' bound to '$t'"
  21.  
  22.   set j_teb(cutbuffer) {}
  23.   set j_teb(dragscroll,txnd) 0
  24.   set j_teb(dragscroll,delay) 50
  25.   set j_teb(scanpaste_time) 0
  26.   set j_teb(scanpaste_paste) 1
  27.  
  28.   set j_teb(keymap,$t) edt-normal
  29.   
  30.   # not impl. up to now: set j_ed(edt,$t,select,on) 0
  31.  
  32.   # in tk4, we need to make sure tkTextBind is called _before_
  33.   #   j:tb:key_bind!
  34.   j:tk4 {tkTextBind Enter}
  35.   
  36.   j:tb:key_bind $t
  37.   j:tb:mouse_bind $t
  38.   
  39.   j:tkb:mkmap Text edt-normal edt-normal {
  40.     {Up                j:tkb:up}
  41.     {Down            j:tkb:down}
  42.     {Left            j:tkb:left}
  43.     {Right            j:tkb:right}
  44.  
  45.     {Find            j:tb:beep}
  46.     {Insert            j:tb:beep}
  47.     {apLineDel            j:tb:beep}
  48.     {Select            j:tb:beep}
  49.     {Prior            j:tb:beep}
  50.     {Next            j:tb:beep}
  51.  
  52.     {KP_F1            j:tkb:edt:gold}
  53.     {KP_F2            j:tb:beep}
  54.     {KP_F2_X            j:tkb:edt:help-bindings}
  55.     {KP_F3            j:tb:beep}
  56.     {KP_F3_X            j:tkb:find-next}
  57.     {KP_F4            j:tkb:edt:del-line}
  58.  
  59.     {KP_0            j:tkb:edt:line}
  60.     {KP_1            j:tkb:edt:word}
  61.     {KP_2            j:tkb:edt:eol}
  62.     {KP_3            j:tkb:edt:char}
  63.     {KP_4            j:tkb:edt:advance}
  64.     {KP_5            j:tkb:edt:backup}
  65.     {KP_6            j:tb:beep}
  66.     {KP_6_X            j:tkb:edt:cut-range}
  67.     {KP_7            j:tkb:edt:page}
  68.     {KP_8            j:tb:beep}
  69.     {KP_8_X            j:tkb:edt:append}
  70.     {KP_9            j:tb:beep}
  71.     {KP_9_X            j:tkb:edt:replace}
  72.  
  73.     {KP_Subtract        j:tkb:edt:del-word}
  74.     {KP_Separator        j:tkb:edt:del-char}
  75.     {KP_Enter            j:tb:beep}
  76.     {KP_Decimal            j:tb:beep}
  77.     {KP_Decimal_X        j:tkb:edt:sel-range}
  78.  
  79.     {Return            j:tkb:insert_newline}
  80.     {BackSpace            j:tkb:delete_left}
  81.     {Delete            j:tkb:delete_left}
  82.  
  83.     {Control-DEFAULT        j:tkb:self_insert}
  84.     {DEFAULT            j:tkb:self_insert}
  85.     {Shift-DEFAULT        j:tkb:self_insert}
  86.   }
  87.  
  88.   j:tkb:mkmap Text edt-gold edt-normal {
  89.     {Up                j:tkb:up}
  90.     {Down            j:tkb:down}
  91.     {Left            j:tkb:left}
  92.     {Right            j:tkb:right}
  93.     
  94.     {Find            j:tb:beep}
  95.     {Insert            j:tb:beep}
  96.     {apLineDel            j:tb:beep}
  97.     {Select            j:tb:beep}
  98.     {Prior            j:tb:beep}
  99.     {Next            j:tb:beep}
  100.  
  101.     {KP_F1            j:tb:beep}
  102.     {KP_F2            j:tb:beep}
  103.     {KP_F2_X            j:tkb:edt:help}
  104.     {KP_F3            j:tb:beep}
  105.     {KP_F3_X            j:tkb:find-string}
  106.     {KP_F4            j:tkb:edt:restore-line}
  107.  
  108.     {KP_2            j:tb:beep}
  109.     {KP_2_X            j:tkb:edt:open-line}
  110.     {KP_1            j:tb:beep}
  111.     {KP_1_X            j:tkb:change-case}
  112.     {KP_2            j:tkb:edt:del-eol}
  113.     {KP_3            j:tb:beep}
  114.     {KP_3_X            j:tkb:literal-insert}
  115.     {KP_4            j:tkb:eof}
  116.     {KP_5            j:tkb:bof}
  117.     {KP_6            j:tkb:edt:ins-buffer paste}
  118.     {KP_7            j:tb:beep}
  119.     {KP_7_X            j:tkb:edt:command}
  120.     {KP_8            j:tb:beep}
  121.     {KP_8_X            j:tkb:edt:fill}
  122.     {KP_9            j:tb:beep}
  123.     {KP_9_X            j:tkb:edt:replace}
  124.  
  125.     {KP_Subtract        j:tkb:edt:restore-word}
  126.     {KP_Separator        j:tkb:edt:restore-char}
  127.     {KP_Enter            j:tb:beep}
  128.     {KP_Enter_X            j:tkb:edt:g-enter}
  129.     {KP_Decimal            j:tb:beep}
  130.     {KP_Decimal_X        j:tkb:edt:g-decimal}
  131.  
  132.     {0                j:tkb:continue_number}
  133.     {1                j:tkb:continue_number}
  134.     {2                j:tkb:continue_number}
  135.     {3                j:tkb:continue_number}
  136.     {4                j:tkb:continue_number}
  137.     {5                j:tkb:continue_number}
  138.     {6                j:tkb:continue_number}
  139.     {7                j:tkb:continue_number}
  140.     {8                j:tkb:continue_number}
  141.     {9                j:tkb:continue_number}
  142.  
  143.     {Control-DEFAULT        j:tb:beep}
  144.     {DEFAULT            j:tb:beep}
  145.     {Shift-DEFAULT        j:tb:beep}
  146.   }
  147.  
  148. #  j:bind:set_map edt-normal $class
  149. #        {Alt-a            literal-insert Σ}
  150. #        {Alt-A            literal-insert Σ}
  151. #        {Alt-o            literal-insert ÷}
  152. #        {Alt-O            literal-insert ╓}
  153. #        {Alt-u            literal-insert ⁿ}
  154. #        {Alt-U            literal-insert ▄}
  155. #        {Alt-s            literal-insert ▀}
  156. }
  157.  
  158. #####################################################################
  159. # Public routines
  160.  
  161. #####################################################################
  162.  
  163. proc j:tkb:edt:gold { w k a } {
  164.   j:tkb:new_mode edt-gold $w $k $a
  165. }
  166.  
  167. #####################################################################
  168.  
  169. proc j:tkb:edt:char { w k a } { j:tb:edt:move tkb "" $w $k $a }
  170.  
  171. proc j:tkb:edt:word { w k a } { j:tb:edt:move tkb word_ $w $k $a }
  172.  
  173. proc j:tb:edt:move { sfx range w k a } {
  174.   if [j:tb:edt:isForw $w] {
  175.     j:$sfx:${range}right $w $k $a
  176.   } else {
  177.     j:$sfx:${range}left $w $k $a
  178.   }
  179. }
  180.  
  181. proc j:tkb:edt:line { w k a } { j:tb:edt:line tkb bol $w $k $a }
  182.  
  183. proc j:tkb:edt:eol { w k a } { j:tb:edt:line tkb eol $w $k $a }
  184.  
  185. proc j:tb:edt:line { sfx to w k a } {
  186.   if [j:tb:edt:isForw $w] {
  187.     if [j:tb:is_$to $w] {
  188.       j:$sfx:down $w $k $a
  189.     }
  190.   } else {
  191.     if [j:tb:is_$to $w] {
  192.       j:$sfx:up $w $k $a
  193.     }
  194.   }
  195.   j:tkb:$to $w $k $a
  196. }
  197.  
  198. proc j:tkb:edt:page { w k a } { j:tb:edt:page tkb TO $w $k $a }
  199.  
  200. proc j:tb:edt:page { sfx to w k a } {
  201.   if [j:tb:edt:isForw $w] {
  202.     j:tkb:scroll_down
  203.   } else {
  204.     j:tkb:scroll_up
  205.   }
  206. }
  207.  
  208. #####################################################################
  209.  
  210. proc j:tkb:edt:del-char { w k a } { j:tb:edt:delChar tkb $w $k $a }
  211.  
  212. proc j:tb:edt:delChar { sfx w k a} {
  213.   global j_tkb
  214.   
  215.   if [j:tb:edt:isForw $w] {
  216.     set j_tkb(edtcharbuf,$w) [$w get insert insert]
  217.     j:$sfx:delete_right $w $k $a
  218.   } else {
  219.     set j_tkb(edtcharbuf,$w) [$w get {insert - 1 char} {insert - 1 char}]
  220.     j:$sfx:delete_left $w $k $a
  221.   }
  222. }
  223.  
  224. proc j:tkb:edt:restore-char { w k a } {
  225.   global j_tkb
  226.   if [info exists j_tkb(edtcharbuf,$w)] {
  227.     j:text:insert_string $w $j_tkb(edtcharbuf,$w)
  228.   }
  229. }
  230.  
  231. proc j:tkb:edt:del-word { w k a } { j:tb:edt:delWord tkb $w $k $a}
  232.  
  233. proc j:tb:edt:delWord { sfx w k a } {
  234.   global j_tkb
  235.   
  236.   if ![info exists j_tkb(edt-word-warned)] {
  237.     j:alert -text "word buffer not implemented"
  238.     set j_tkb(edt-word-warned) 1
  239.   }
  240.   if [j:tb:edt:isForw $w] {
  241.     j:$sfx:delete_right_word $w $k $a
  242.   } else {
  243.     j:$sfx:delete_left_word $w $k $a
  244.   }
  245. }
  246.  
  247. proc j:tkb:edt:restore-word { w k a } {
  248.   j:tb:beep $w
  249. }
  250.  
  251. proc j:tkb:edt:del-eol { w k a } {
  252.   j:text:delete [$w index insert] [$w index "insert lineend"]
  253. }
  254.  
  255. proc j:tkb:edt:del-line { w k a } {
  256.   global j_tkb
  257.   
  258.   set start [$w index insert]
  259.   set final [$w index "insert lineend + 1 char"]
  260.   set j_tkb(edtlinebuf,$w) [$w get $start $final]
  261.   j:text:delete $w $start $final
  262. }
  263.  
  264. proc j:tkb:edt:restore-line { w k a } {
  265.   global j_tkb
  266.   if [info exists j_tkb(edtlinebuf,$w)] {
  267.     j:text:insert_string $w $j_tkb(edtlinebuf,$w)
  268.   }
  269. }
  270.  
  271. proc j:tkb:edt:ins-buffer { name w k a } {
  272.   set oldpos [$w index insert]
  273.   # j:tb:edt:buf:get $w $name insert            ########
  274.   $w mark set insert $oldpos
  275. }
  276.  
  277. #####################################################################
  278.  
  279. proc j:tkb:edt:page { w k a } {
  280.   if [j:tb:edt:isForw $w] {
  281.     j:tkb:scroll_down $w $k $a
  282.   } else {
  283.     j:tkb:scroll_up $w $k $a
  284.   }
  285. }
  286.  
  287. #####################################################################
  288.  
  289. proc j:tkb:edt:advance { w k a } {
  290.   j:tb:edt:setForw $w
  291. }
  292.  
  293. proc j:tkb:edt:backup { w k a } {
  294.   j:tb:edt:setBack $w
  295. }
  296.  
  297. #####################################################################
  298. #####################################################################
  299. # Internally used routines
  300. #####################################################################
  301. #####################################################################
  302.  
  303.  
  304. #####################################################################
  305. # Prodecure set for editing direction handling
  306.  
  307. proc j:tb:edt:isForw { w } {
  308.   global j_ed
  309.   
  310.   if { ! [info exists j_ed(edt,$w,forward)]} {
  311.     set j_ed(edt,$w,forward) 1
  312.   }
  313.   return $j_ed(edt,$w,forward)
  314. }
  315.  
  316. proc j:tb:edt:setForw { w } { global j_ed; set j_ed(edt,$w,forward) 1 }
  317. proc j:tb:edt:setBack { w } { global j_ed; set j_ed(edt,$w,forward) 0 }
  318.  
  319. ######################################################################
  320. # following are from Achim's file "jediInit.tcl":
  321.  
  322. #####################################################################
  323. # Buffer handling. 2 modes:
  324. #
  325. #    - passed by indices  {1/0 on success/failure)
  326. #        j:tb:edt:buf:insert $w $bufname $start $final
  327. #        j:tb:edt:buf:get    $w $bufname $start
  328. #
  329. #    - passed as text (alla read/write file)
  330. #        j:tb:edt:buf:write $w $name $text
  331. #        j:tb:edt:buf:read  $w $name  -> return text or {}
  332. #
  333.  
  334. proc j:tb:edt:buf:insert { w name start final } {
  335.   global j_ed
  336.   set j_ed(buf,$w,$name) [$w get $start $final]
  337. }
  338. proc j:tb:edt:buf:write { w name text } {
  339.   global j_ed
  340.   set j_ed(buf,$w,$name) $text
  341. }
  342.  
  343. proc j:tb:edt:buf:get { w name start} {
  344.   global j_ed
  345.   if [info exists j_ed(buf,$w,$name)] {
  346.     j:text:move $start
  347.     j:text:insert_string $j_ed(buf,$w,$name)
  348.     return 1
  349.   } else {
  350.     j:alert -text "$w: Buffer `$name' is empty."
  351.     return 0
  352.   }
  353. }
  354. proc j:tb:edt:buf:read { w name } {
  355.   global j_ed
  356.   if [info exists j_ed(buf,$w,$name)] {
  357.     return $j_ed(buf,$w,$name)
  358.   } else {
  359.     j:alert -text "$w: Buffer `$name' is empty."
  360.     return {}
  361.   }
  362. }
  363.